#ifndef EVENTLOOPTHREAD_HPP
#define EVENTLOOPTHREAD_HPP

#include <thread>
#include <mutex>
#include <condition_variable>
#include "EventLoop.hpp"

// 定义了一个名为 EventLoopThread 的类，它的作用是创建一个新线程并在该线程中运行一个 EventLoop 事件循环。
// 通过这个类，可以方便地创建一个新的线程，并在该线程中运行一个 EventLoop 事件循环，从而实现多线程编程。
class EventLoopThread {
public:
    EventLoopThread();
    ~EventLoopThread();
    // noncopyable
    EventLoopThread(const EventLoopThread&) = delete;
    EventLoopThread& operator=(const EventLoopThread&) = delete;
    // 在 startLoop() 函数中，首先使用 condMutex_ 加锁，然后创建一个新的线程，并将 threadFunc() 函数作为线程的执行函数。
    // 接着使用 cond_ 等待条件变量，直到 loop_ 成员变量不为 nullptr，表示新线程已经创建并运行了 EventLoop。
    // 最后，使用 condMutex_ 解锁，并返回 loop_ 成员变量。
    sp_EventLoop startLoop();
    sp_EventLoop getLoop();
    void stop();
    void join();

private:
    // 在 threadFunc 函数中，首先创建一个 EventLoop，并将其保存在 loop_ 成员变量中。然后使用 cond_ 等待条件变量，直到 exiting_ 成员变量为 true，表示线程需要退出。
    // 最后，销毁 EventLoop 对象，并将 loop_ 成员变量置为 nullptr。
    void threadFunc(); // 线程运行函数
    sp_EventLoop loop_;// loop_ 指向的EventLoop运行在新创建的线程thread_中
    std::thread thread_;
    std::mutex condMutex_;
    std::condition_variable cond_;
    bool exiting_;
};

#endif // EVENTLOOPTHREAD_HPP